<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
        在开启严格模式下的语法和行为改变
            必须用 var 声明变量，不允许使用未声明的变量
            禁止自定义的函数中的 this 指向 window
            创建 eval 作用域
            对象不能有重名的属性（Chrome 已经修复了这个 Bug，IE 还会出现）
            函数不能有重复的形参
            新增一些保留字, 如: implements interface private protected public
        */
        'use strict';

       //1. 必须用 var 声明变量，不允许使用未声明的变量
       //num = 100; // 必须用 var 声明变量

       //2. 禁止自定义的函数中的 this 指向 window
    //    function demo(){
    //         // 此处this默认执行window，但在严格模式下为：undefined
    //         console.log(this);
    //    }
    //    demo();

        //3. 创建 eval 作用域 (其中eval是个函数，可以将字串参数作为js脚本执行)
        // var str = 'var age = 20;alert(age);';
        // console.log(str);
        // eval(str); // 将str字串作为js脚本执行
        // console.log(age);

        //4. 对象不能有重名的属性（Chrome 已经修复了这个 Bug，IE 还会出现）
        // var ob = {m:100, m:200, n:300};
        // // 正常输出：{m: 200, n: 300}， 但在严格模式下不允许出现重名属性名
        // console.log(ob); 

        //5. 函数不能有重复的形参
        // function fun(a,a){
        //     console.log(a);
        // }
        // fun(10,20);
        
        //6. 新增一些保留字, 如: implements interface private protected public
        var private = 100; // 开启严格模式下，就不可以使用这些保留字做变量名使用。
        console.log(private);
    </script>
</body>
</html>